"""
公告模块API视图
"""
from rest_framework import viewsets, status
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from django.db.models import Q

from .models import Announcement
from .serializers import AnnouncementSerializer, AnnouncementListSerializer


class AnnouncementViewSet(viewsets.ModelViewSet):
    """
    公告管理ViewSet
    
    提供公告的CRUD操作:
        - list: 获取公告列表（支持搜索、排序、分页）
        - retrieve: 获取公告详情
        - create: 发布新公告（仅教师及以上）
        - update: 更新公告（仅创建人或管理员）
        - destroy: 删除公告（仅创建人或管理员）
    """
    queryset = Announcement.objects.all().select_related('user')
    serializer_class = AnnouncementSerializer
    permission_classes = [IsAuthenticated]
    
    def get_serializer_class(self):
        """根据不同的action返回不同的序列化器"""
        if self.action == 'list':
            return AnnouncementListSerializer
        return AnnouncementSerializer
    
    def get_queryset(self):
        """
        获取查询集
        
        支持排序：按时间倒序
        """
        queryset = Announcement.objects.all().select_related('user')
        
        # 排序（默认按时间倒序）
        ordering = self.request.query_params.get('ordering', '-time')
        queryset = queryset.order_by(ordering)
        
        # 搜索功能
        search = self.request.query_params.get('search', None)
        if search:
            queryset = queryset.filter(
                Q(title__icontains=search) |
                Q(content__icontains=search)
            )
        
        return queryset
    
    def create(self, request, *args, **kwargs):
        """
        发布公告
        
        权限：仅教师及以上可发布
        """
        # 检查权限：教师或管理员才能发布公告
        if not (request.user.is_staff or request.user.groups.filter(name__in=['教师', '辅导员', '学工办']).exists()):
            return Response({
                'code': 403,
                'message': '权限不足，仅教师及以上可发布公告'
            }, status=status.HTTP_403_FORBIDDEN)
        
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        # 保存数据到数据库,传入当前用户
        instance = serializer.save(user=request.user)
        
        # 重新序列化以包含完整的关联数据
        response_serializer = self.get_serializer(instance)
        
        return Response({
            'code': 201,
            'message': '发布成功',
            'data': response_serializer.data
        }, status=status.HTTP_201_CREATED)
    
    def update(self, request, *args, **kwargs):
        """
        更新公告
        
        权限：仅创建人或管理员可更新
        """
        instance = self.get_object()
        
        # 检查权限：只有创建人或管理员可以修改
        if not (request.user.is_staff or instance.user == request.user):
            return Response({
                'code': 403,
                'message': '权限不足，仅创建人或管理员可修改公告'
            }, status=status.HTTP_403_FORBIDDEN)
        
        partial = kwargs.pop('partial', False)
        serializer = self.get_serializer(instance, data=request.data, partial=partial)
        serializer.is_valid(raise_exception=True)
        self.perform_update(serializer)
        
        return Response({
            'code': 200,
            'message': '更新成功',
            'data': serializer.data
        })
    
    def destroy(self, request, *args, **kwargs):
        """
        删除公告
        
        权限：仅创建人或管理员可删除
        """
        instance = self.get_object()
        
        # 检查权限：只有创建人或管理员可以删除
        if not (request.user.is_staff or instance.user == request.user):
            return Response({
                'code': 403,
                'message': '权限不足，仅创建人或管理员可删除公告'
            }, status=status.HTTP_403_FORBIDDEN)
        
        self.perform_destroy(instance)
        
        return Response({
            'code': 204,
            'message': '删除成功'
        }, status=status.HTTP_204_NO_CONTENT)
    
    def retrieve(self, request, *args, **kwargs):
        """获取公告详情"""
        instance = self.get_object()
        serializer = self.get_serializer(instance)
        return Response(serializer.data)
